package com.codemonkey.lq.tools;

import java.io.File;

/**
 * 用过Maven的应该都遇到过，当网速不好或者源有问题的时候，Maven的依赖包经常下载失败。
 * 下载失败后在本地仓库对应的文件夹中有一个以.lastUpdated结尾的文件，如果不手动删除这个文件，就不能重新更新依赖，重新下载对应的jar包。
 * 
 * 警告:
 *     1. 会将本地安装的jar包也会删除,因为偶尔我们也会进入到这些本地安装的jar包内部,而maven下载源码是肯定找不到的.
 *     2. 考虑加入一个排除清单.
 *     3. _thirdlibsLearing项目下有个install_LocalJars文件
 * 
 * From http://blog.csdn.net/isea533/article/details/49905659
 * 
 * <p> 清除BAT脚本： 
 * 
 * @author lq
 *
 */
public final class MvnCleanTool {
	// 原理是上删除以lastUpdated结尾的文件

	//	1. 可以在IDE中指定参数后运行这段代码，例如直接调方法findAndDelete(new File("d:\\.m2\\repository"));
	//
	//	2. 或者在命令行下执行这段代码：
	//
	//	   	   首先javac CleanMvn.java编译为.class文件。
	//
	//	       然后java CleanMvn d:\.m2\repository通过后面的参数来删除本地仓库中无效的文件。

	private static final String MAVEN_PATH = "c:\\Users\\LQ\\.m2\\repository";

	public static void main(String[] args) {

		/* IDE执行  */
		findAndDelete(new File(MAVEN_PATH));

		/* 命令行执行

		if(args.length != 1){
		       print("使用方法错误，方法需要一个参数，参数为mvn本地仓库的路径");
		   }
		   findAndDelete(new File(args[0]));
		*/
	}

	public static boolean findAndDelete(File file) {
		if (!file.exists()) {
		} else if (file.isFile()) {
			if (file.getName().endsWith("lastUpdated")) {
				deleteFile(file.getParentFile());
				return true;
			}
		} else if (file.isDirectory()) {
			File[] files = file.listFiles();
			for (File f : files) {
				if (findAndDelete(f)) {
					break;
				}
			}
		}
		return false;
	}

	public static void deleteFile(File file) {
		if (!file.exists()) {
		} else if (file.isFile()) {
			print("删除文件:" + file.getAbsolutePath());
			file.delete();
		} else if (file.isDirectory()) {
			File[] files = file.listFiles();
			for (File f : files) {
				deleteFile(f);
			}
			print("删除文件夹:" + file.getAbsolutePath());
			print("====================================");
			file.delete();
		}
	}

	public static void print(String msg) {
		System.out.println(msg);
	}
}
